package com.gmrz.uap.user;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.gmrz.uap.cfg.SystemConst;
import com.gmrz.uap.common.DbConst;
import com.gmrz.uap.common.ServiceSupport;
import com.gmrz.uap.model.User;
import com.gmrz.uap.model.UserRole;
import com.gmrz.uap.util.Encodes;
import com.gmrz.uap.util.Identities;
import com.jfinal.aop.Before;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.tx.Tx;
import org.apache.commons.codec.digest.DigestUtils;
import org.joda.time.DateTime;
import org.joda.time.Duration;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;

public class UserService extends ServiceSupport {
    public static final UserService me = new UserService();
    private static final User userDao = User.dao;
    private static final UserRole userRoleDao = UserRole.dao;

    /**
     * 根据页面传过来的条件进行分页查询
     *
     * @param user  管理员信息
     * @param page  页号
     * @param rows  行数
     * @param sort  排序字段
     * @param order 升序/降序
     * @return　分页结果 Page<User>
     */
    public List<User> findListForPaginate(User user, int page, int rows, String sort, String order) {
        return userDao.findListForPaginate(user, page, rows, sort, order);
    }

    /**
     * 增加管理员信息
     *
     * @param user 用户信息
     * @return true/false
     */
    @Before(Tx.class)
    public boolean save(User user) {
        user.setUserId(Identities.uuid2());
        //user.setUpdatets(new Timestamp(new DateTime().getMillis()));
        DateTime before = new DateTime().minusDays(91);
        user.setUpdatets(new Timestamp(before.getMillis()));
        user.setIcon("fa-user");
        return user.save();
    }

    /**
     * 修改管理员信息
     *
     * @param user 用户信息
     * @return true/false
     */
    @Before(Tx.class)
    public boolean update(User user) {
        user.setUpdatets(new Timestamp(new DateTime().getMillis()));
        return user.update();
    }

    /**
     * 根据参数删除管理员信息，ID可以是多个，中间使用逗号隔开
     *
     * @param ids ID集合
     * @return true/false
     */
    @Before(Tx.class)
    public boolean remove(String ids) {
        String[] idArr = ids.split(SystemConst._DEFAULT_SEPARATOR_COMMA);

        for (String id : idArr) {
            userRoleDao.deleteByUserId(id);
            flag = userDao.deleteById(id);
            if (!flag) {
                break;
            }
        }
        return flag;
    }


    @Before(Tx.class)
    public boolean resetPwds(String ids) {

        String[] idArr = ids.split(SystemConst._DEFAULT_SEPARATOR_COMMA);
        String password = PropKit.use(SystemConst.SYSTEM_CONFIG_FILE).get("default.password");

        flag = userDao.resetPassword(idArr, password);
        return flag;
    }

    /**
     * 根据ID获取管理员信息
     *
     * @param id 主键
     * @return User 管理员信息
     */
    public User findOne(String id) {
        return userDao.findById(id);
    }

    /**
     * 根据用户名和密码获取管理员信息
     *
     * @param name     用户名
     * @param password 密码
     * @return User 管理员信息
     */
    public User findUserByUsernameAndPassword(String name, String password) {
        return userDao.getUserByUsernameAndPassword(name, password);
    }

    /**
     * 根据用户名判断管理员是否存在
     *
     * @param username 用户名
     * @return true/false
     */
    public boolean exist(String username) {
        User user = userDao.getUserByUsername(username);
        return null == user;
    }

    /**
     * 查看用户密码是否过期
     *
     * @param username 用户名
     * @return true/false 是否过期
     */
    public boolean passwordExpire(String username) {
        boolean flag = false;
        User user = userDao.getUserByUsername(username);

        if (null == user.getUpdatets()) {
            user.setUpdatets(new Timestamp(new DateTime().getMillis()));
            user.update();
        }

        //获取过期天数
        long expireDay = PropKit.use(SystemConst.SYSTEM_CONFIG_FILE).getLong("login.password.expiration");

        //更新时间与当前时间的日差值
        long betweenDay = DateUtil.between(user.getUpdatets(), new Date(), DateUnit.DAY);

        if (betweenDay > expireDay) flag = true;

        return flag;
    }


    /**
     * 添加用户角色关联关系
     *
     * @param userRole 用户角色信息
     * @param roles    角色集合
     * @return 是否成功
     */
    @Before(Tx.class)
    public boolean userRoleSave(UserRole userRole, String[] roles) {
        if (roles != null) {
            for (String roleId : roles) {
                userRole.put(DbConst.TABLE_RESOURCE_ROLE_COLUMN_ROLE_ID, roleId);
                flag = userRole.save();
                if (!flag) {
                    break;
                }
            }
        } else {

            List<UserRole> userRoles = userRole.findUserRoleByUserId(userRole.getUserId());
            if (!userRoles.isEmpty()) {
                flag = userRole.deleteByUserId(userRole.getUserId());
            } else {
                flag = true;
            }


        }
        return flag;
    }


    /**
     * 根据用户ID删除用户角色关联
     *
     * @param userId 用户ID
     * @return 是否成功
     */
    public boolean removeByUserId(String userId) {
        return UserRole.dao.deleteByUserId(userId);
    }


    public String[] getRoleId(String userId) {
        List<UserRole> roleByUserId = UserRole.dao.findUserRoleByUserId(userId);
        String[] roleId = new String[roleByUserId.size()];
        for (int x = 0; x < roleByUserId.size(); x++) {
            roleId[x] = roleByUserId.get(x).getRoleId();
        }
        return roleId;
    }


    public boolean updatePassword(String pwd, String userId) {
        return User.dao.updatePassword(new String[]{userId}, pwd);
    }
}
